﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

/*
* cin.get()	//一次只能读一个字符
* cin.get(一个参数) //读一个字符
* cin.get(两个参数)	//可以读字符串
* cin.getline()
* cin.ignore()
* cin.peek()
* cin.putback()
*/
void testCin()
{
	//1.输入as  ，缓冲区 a s 换行，第一个取a，第二个取s，第三个取 换行，第四个等待下次输入；
	char c = cin.get();
	cout << "c= " << c << endl;

	c = cin.get();
	cout << "c= " << c << endl;

	c = cin.get();
	cout << "c= " << c << endl;

	c = cin.get();
	cout << "c= " << c << endl;
	/*as
	c = a
	c = s
	c =

	1
	c = 1*/

}
void testCinString()
{
	//2.cin.get(两个参数)	//可以读字符串
	char buf[1024];
	//3.cin.get(两个参数)读取字符串时，不会把换行符拿走，换行符还遗留在缓冲区中；
	cin.get(buf, 1024);

	char c = cin.get();
	if (c == '\n')
	{
		cout << "换行还在缓冲区！" << endl;
	}
	else
	{
		cout << "换行不在缓冲区！" << endl;
	}
	cout << buf << endl;

	/*hello world
	换行还在缓冲区！
	hello world*/
}
void testCinGetline()
{
	//4.cin.getline()
	char buf[1024];
	//5.cin.getline()把换行符读取，然后扔掉；
	cin.getline(buf, 1024);

	char c = cin.get();
	if (c == '\n')
	{
		cout << "换行还在缓冲区！" << endl;
	}
	else
	{
		cout << "换行不在缓冲区！" << endl;
	}
	cout << buf << endl;

	/*hello world

	换行还在缓冲区！
	hello world*/
}
void testCinIgnore()
{
	//6.没有参数，代表忽略一个字符；
	//cin.ignore();
	cin.ignore(2);

	char c = cin.get();//as --> ase
	cout << "c= " << c << endl;//c= s --> c= e
}
void testCinPeek()
{
	//7.cin.peek()，偷窥；输入as，偷看一眼a，然后再放回缓冲区，缓冲区中还是as；
	char c = cin.peek();
	cout << "c= " << c << endl;//c= a

	c = cin.get();
	cout << "c= " << c << endl;//c= a
}
void testCinPutback()
{
	//8.cin.putback()，放回；
	char c = cin.get();
	cin.putback(c);

	char buf[1024];
	cin.getline(buf, 1024);
	cout << buf << endl;

	/*hello world
	hello world*/

}
//9.案例一：判断用户输入的是字符串，还是数字；
void testInputContent()
{
	cout << "请输入一串数字或者字符串：" << endl;

	//10.偷窥；
	char c = cin.peek();//1 --> n
	if (c >= '0' && c <= '9')
	{
		int num;
		cin >> num;
		cout << "您输入的是数字，数字为：" << num << endl;//1
	}
	else
	{
		char buf[1024];
		cin >> buf;
		cout << "您输入的是字符串，字符串为：" << buf << endl;//n
	}
}
//11.案例二：让用户输入1到10的数字，如果输入有误，重新输入；
void testInputNum()
{
	int num;

	cout << "请输入一个1到10的数字：" << endl;

	while (true)
	{
		cin >> num;
		if (num > 0 && num <= 10)
		{
			cout << "输入的数字为：" << num << endl;
			break;
		}

		cout << "对不起，请重新输入！" << endl;

		//13.重置标志位；
		cin.clear();
		//14.清空缓冲区；
		cin.sync();

		//12.标志位：0是正常的，1是不正常的；
			//事实证明，就是加上13.和14.代码，依然报错，标志位的做法不对！
			//没办法了，搞不定，网上查了也没找到有效措施，不甘心啊，可又有什么办法呢...
		cout << "标志位：" << cin.fail() << endl;
	}
}

//main315：标准输入流
int main315()
{
	//testCin();
	//testCinString();
	//testCinGetline();
	//testCinIgnore();
	//testCinPeek();
	//testCinPutback();

	//testInputContent();
	testInputNum();
	system("pause");
	return EXIT_SUCCESS;
}